import java.io.*; class ExcepcionMoneda extends Exception { public ExcepcionMoneda(String s) { super(s); /* llama al constructor de la clase padre Exception */ } } class Moneda { /* atributos de clase, visibles en todos los métodos */ /* se declaran estaticos, ya que son accesados por métodos estáticos */ static char tablero[ ]; /*declaracion de arreglo vacio */ static int PM = 2; /* posicion de la moneda PM */ public static void inicializarTablero() { tablero = new char[5]; /* asigna dimension al tablero */ /*inicializa el tablero con 'x' y luego posiciona la moneda 'o' en su posición inicial almacenada en el atributo PM */ for(int i = 0; i < tablero.length; i++) tablero[i] = 'x'; tablero[PM] = 'o'; } /* imprime en pantalla el estado del tablero */ public static void mostrarTablero() { System.out.println("\n\tTablero"); System.out.println("\t-------\n"); for(int i = 0; i < tablero.length; i++) System.out.print("\t" + tablero[i]); System.out.println(); } /* imprime en pantalla las opciones de movimiento */ public static void mostrarOpciones() { String s = "\n\tIndique a donde mover la moneda\n\n"; s += "\t4) IZQUIERDA\t5) CENTRO\t6) DERECHA"; s += "\n\t1) SALIR.\n"; System.out.println(s); } /* imprime en pantalla una introduccion o explicacion del programa */ public static void introduccion() { String s = "\n\n\tPROGRAMA DE LA MONEDA Y EL TABLERO\n"; s += "\t----------------------------------\n"; s += "\n\tEl programa consiste en mover la moneda 'o' del tablero "; s += "\n\ta la izquierda o a la derecha "; s += "\n\n\tSi intentas mover la moneda fuera del tablero "; s += "\n\tel programa lanzara un excepcion..."; s += "\n\n\tPara mayor comodidad puedes usar el teclado numerico (asegurate) "; s += "\n\tde activar este teclado con la tecla Bloq Num"; System.out.println(s); } /* El constructor de la clase ExcepcionMoneda, requiere que se le pase como parametro un String s que refleje en palabras la excepcion que se produjo. Como en este caso, la excepcion se produce o se lanza debido a un intento de acceso a una posicion invalida del tablero, en el siguiente metodo vamos a generar un String de mensaje en funcion de la posicion. Ahora bien, para poder acceder a este mensaje, en el bloque catch correspondiente a la excepcion ExcepcionMoneda, se debe imprimir en pantalla el retorno del método getMessage(). */ public static String generarMensajeExcepcion(int posicion) { String s = "\tLa moneda no puede moverse hacia la "; if (posicion < 0) { s += "izquierda..."; } else { if (posicion > 4) { s += "derecha..."; } } s += "\n\tDecide si la moneda retorna al centro o se mueve de aqui!"; return s; } /* El metodo posicionar, determina una posicion auxiliar en funcion de la opcion de movimiento, que es accesada a riesgo de producir una excepcion de tipo ArrayIndexOutOfBoundsException */ public static void posicionar(int opcion) throws ExcepcionMoneda { int pos = PM; /* OPCIONES de movimiento (teclado numerico): 5.- Ir al centro 4.- Izquierda 6.- Derecha */ switch(opcion) { case 4 : pos = PM - 1; break; case 5 : pos = 2; break; case 6 : pos = PM + 1; break; } try { tablero[pos] = 'o'; /* Si pos es invalida entonces el flujo salta hacia el bloque catch, lanzando la excepcion ExcepcionMoneda, con el String generado en el método generarMensajeExcepcion. Por ende, no se ejecutarian las dos instrucciones siguientes, manteniendo intacta la posicion de la moneda y el estado del tablero. En cambio, si pos es valida, se ejecutan las dos instrucciones siguientes sin problema */ if (PM != pos) { tablero[PM] = 'x'; /* asigna una x a la posicion actual */ PM = pos; /* se asigna nueva posicion a la moneda */ } } catch(ArrayIndexOutOfBoundsException e) { throw new ExcepcionMoneda(generarMensajeExcepcion(pos)); } } /* El metodo principal main(), consiste basicamente en un ciclo iterativo que realiza los siguientes pasos : 1) Inicializa el tablero 2) Muestra una explicacion o introduccion al programa 3) Muestra el estado del tablero 4) Muestra las opciones de movimiento 5) Lee la opcion por teclado 6) Llama al metodo posicionar, que tiene la particularidad de poder generar una excepcion 7) Volver al paso 3) mientras la opcion no sea salir */ public static void main(String[ ] args) { int opcion = 0; BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); inicializarTablero(); introduccion(); try { System.out.print("\n\n\tPresiona tecla para continuar..."); in.readLine(); } catch(IOException e){ } do { try { mostrarTablero(); mostrarOpciones(); System.out.print("\n\tIngresa la opcion : "); opcion = Integer.parseInt(in.readLine()); if (opcion != 1) posicionar(opcion); } catch (ExcepcionMoneda e) { System.out.println("\n" + e.getMessage()); } catch(IOException ioe) { } } while(opcion != 1); System.out.println("\n\n\tFIN DEL PROGRAMA.\n"); } }